]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
workspaceAnimation: Use window clones
authorAlexander Mikhaylenko <alexm@gnome.org>
Thu, 4 Jul 2019 18:15:15 +0000 (23:15 +0500)
committerMarge Bot <marge-bot@gnome.org>
Tue, 2 Feb 2021 19:35:07 +0000 (19:35 +0000)
Instead of reparenting windows, clone them. This will allow to properly
support multi-monitor setups in subsequent commits.

Block window mapping animation while the animation is running to prevent
new windows appearing during the animation from being visible at the same
time as their clones.

Fixes https://gitlab.gnome.org/GNOME/mutter/issues/929

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1326>

js/ui/workspaceAnimation.js

index 83370b2a3cfdbe94ab3a1df6d3b969ae8e3af7d5..e01371c49c29b01eb2673b58a41ed1a80325c47e 100644 (file)
@@ -37,12 +37,16 @@ class WorkspaceGroup extends Clutter.Actor {
     }
 
     _syncStacking() {
-        const windowActors = global.get_window_actors();
-        let lastSibling = null;
+        const windowActors = global.get_window_actors().filter(w =>
+            this._shouldShowWindow(w.meta_window));
+
+        let lastRecord;
 
         for (const windowActor of windowActors) {
-            this.set_child_above_sibling(windowActor, lastSibling);
-            lastSibling = windowActor;
+            const record = this._windowRecords.find(r => r.windowActor === windowActor);
+
+            this.set_child_above_sibling(record.clone, lastRecord ? lastRecord.clone : null);
+            lastRecord = record;
         }
     }
 
@@ -51,16 +55,18 @@ class WorkspaceGroup extends Clutter.Actor {
             this._shouldShowWindow(w.meta_window));
 
         for (const windowActor of windowActors) {
-            const record = {
-                windowActor,
-                parent: windowActor.get_parent(),
-            };
+            const clone = new Clutter.Clone({
+                source: windowActor,
+                x: windowActor.x,
+                y: windowActor.y,
+            });
+
+            this.add_child(clone);
 
-            record.parent.remove_child(windowActor);
-            this.add_child(windowActor);
-            windowActor.show();
+            const record = { windowActor, clone };
 
             record.windowDestroyId = windowActor.connect('destroy', () => {
+                clone.destroy();
                 this._windowRecords.splice(this._windowRecords.indexOf(record), 1);
             });
 
@@ -71,11 +77,7 @@ class WorkspaceGroup extends Clutter.Actor {
     _removeWindows() {
         for (const record of this._windowRecords) {
             record.windowActor.disconnect(record.windowDestroyId);
-            this.remove_child(record.windowActor);
-            record.parent.add_child(record.windowActor);
-
-            if (!this._workspace.active)
-                record.windowActor.hide();
+            record.clone.destroy();
         }
 
         this._windowRecords = [];